package com.financing.wap.util;

/**
 * 
 */

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;

import org.apache.commons.lang.StringUtils;

import com.financing.wap.common.BizEnums;


/**
 *
 * 基础工具类
 * 
 * @author lisu
 *
 */
public class BasicUtils {

	public static String showMaps(Map maps){
		
		if( null == maps || maps.size() == 0 ){
			return "maps为空" ;
		}
		
		StringBuffer sb = new StringBuffer() ; 
		
		Set<Entry>  set = maps.entrySet() ;
		Iterator<Entry> i = set.iterator() ;
		while( i.hasNext() ){
			Entry e = i.next() ; 
			sb.append(e.getKey()).append(" = ").append(e.getValue()).append("\n") ;
		}
		
		return sb.toString() ; 
	}
	
	/**
	 * 生成纯数字随机的验证码
	 * @param digit 随机数长度
	 * @return 指定长度随机数字
	 */
	public static String genRandom(int digit){
		//默认生成6位验证码，至少4位
		if(digit<=3) digit = BizEnums.SmsEnums.SMS_IDENTIFY_CODE_MIN_BIT;

		StringBuilder sb = new StringBuilder();
		Random r = new Random();
		for(int i=0;i<digit;i++){
			sb.append(r.nextInt(10));
		}
		return sb.toString();
	}
	
	/**
	 * 把BigDecimal的数字转为百分比，不做四舍五入<br>
	 * 如： 0.0023  -> 0.23%
	 *    1.27365  -> 127.36%
	 *    12345.123556 -> 345.12%
	 *    0.34 -> 34%
	 * @param dig
	 * @return
	 */
	public static String toPercentNice(BigDecimal dig) {
		
		NumberFormat num=NumberFormat.getPercentInstance();
		num.setMaximumIntegerDigits(3);
		num.setMaximumFractionDigits(2);
		num.setRoundingMode(RoundingMode.HALF_DOWN);
		
		return num.format(dig) ;
	}
	
	/**
	 * 原样保留数字，其他功能同toPercent
	 * @param dig 原始数字
	 * @param scale 保留小数
	 * @param 四舍五入模式
	 * 
	 * @return
	 */
	public static String toPercentOral(BigDecimal dig, int scale,RoundingMode rounding){
		BigDecimal bigdec = dig.multiply(new BigDecimal("100")).setScale(scale, rounding);
        return bigdec + "%";
	}
	
	/**
	 * 返回一个平台流水号<br>
	 * 简单实现，取当前时间精确到毫秒<br>
	 * 如：genPlatSerialNoSimple("P")将获得"P20150702132833789"
	 * @param tag 希望在流水号放置的标识符号
	 * @return 
	 */
	//TODO 
	public static String genPlatSerialNoSimple(String tag){
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		Date now = new Date() ;
		return tag+df.format(now);
	}
	
	/**
	 * 格式化指定日期为字符串<br>
	 * @param tag
	 * @return yyyyMMdd格式的字符串
	 */
	public static String formatDateStr(Date date){
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
		Date now = date;
		return df.format(now);
	}
	
	/**
	 * 格式化指定日期为字符串<br>
	 * @param tag
	 * @return yyyyMMddHHmmss格式的字符串
	 */
	public static String formatPayDateStr(Date date){
		SimpleDateFormat df = new SimpleDateFormat(BizEnums.PayEnums.PAY_TIME_PATTERN);
		Date now = date;
		return df.format(now);
	}
	
	/**
	 * 获取当前日期字符串<br>
	 * @return yyyyMMdd格式的字符串
	 */
	public static String getCurrDateStr(){
		Date now = new Date() ;
		return formatDateStr(now) ;
	}

	
	/**
	 * 判断now是否达到标的时间subTime
	 * @param subTime 标的时间
	 * @param now     当前时间
	 * @param interval 超过时间间隔要求(毫秒)
	 * @return true 达到  false 未达到
	 */
	public static boolean isOnTime(Date subTime, Date now, long interval) {
		
		if ( null == now || null == subTime ) {
			return false; 
		}
		
		if (( now.getTime() - subTime.getTime() ) >= interval )
			
			return true; // 达到标的时间
		else
			
			return false;
	}
	
	/**
	 * 检查输入的参数中是否有空值
	 * @param strs
	 * @return
	 */
	public static boolean isEmpty(String ... strs){
		if(strs==null) return true;
		for(String str : strs){
			if(str==null || str.trim().length()==0){
				return true;
			}
		}
		return false;
	}
	
	/**
	 * @author hujianpei
	 * @param s
	 * @return
	 */
	public static boolean isNotEmpty(String s) {
        return !isEmpty(s);
    }
	
	
	/**
	 * 对身份证号进行敏感处理
	 * @param paperNo
	 */
	public static String ensitivePaperNo(String paperNo){
		return  ensitiveStr(paperNo,4,4,'*',6);
	}
	
	/**
	 * 对手机号进行敏感处理
	 * @param phoneNO
	 */
	public static String ensitivePhoneNo(String phoneNO){
		return  ensitiveStr(phoneNO,3,4,'*',4); 
	}

	/**
	 * 对账号进行敏感处理
	 * @param acctNO
	 */
	public static String ensitiveAcctNo(String acctNO){
		return  ensitiveStr(acctNO,0,4,'*',0);
	}
	
	/**
	 * 是否手机
	 * @param acctNO
	 */
	public static boolean isPhone(String phone){
		return  StringUtils.isBlank(phone)?false:phone.matches("1[0-9]{10}");
	}
	
	

	/**
	 * 对字符串进行敏感性处理
	 * @param str
	 * @param hLen 头显示位数
	 * @param tLen 尾显示位数
	 * @param tag 占位符(默认用*)
	 * @param tagLen 占位符长度
	 * @return 如：str="532424198107241651" 
	 * ensitiveStr(str,4,4) 
	 * 则返回：
	 * 5324******1651
	 * 如果str的长度小于hLen或小于tLen或小于(hLen+tLen)，均返回str
	 */
	private static String ensitiveStr(String str, int hLen,int tLen,char tag, int tagLen){
		
		if( StringUtils.isEmpty(str)) {
			return "" ;
		}
		
		if( StringUtils.length(str) < hLen || 
			StringUtils.length(str) < tLen || 
			StringUtils.length(str) < (tLen + hLen))
		{
			return str ;
		}
		
		int len = StringUtils.length(str) ;
		StringBuffer sb = new StringBuffer() ;

		String hstr = StringUtils.substring(str, 0, hLen)  ; 
		sb.append(hstr);
		
		for( int i = 0 ; i < tagLen ; i ++ ){
			sb.append(tag) ;
		}
		
		String tstr = StringUtils.substring(str, len - tLen) ;
		sb.append(tstr);

		return sb.toString() ;
	}
	
	public static boolean isNotEmptyList(List list){
		return null != list && list.size()>0;
	}
	
	public static void main(String[] args) {
		
//		System.out.println( ensitiveStr("532424198107241651",4,4,'#',6) );
//		System.out.println( ensitiveStr("532424198107241651",3,5,'*',10) );
//		System.out.println( ensitiveStr("532424198107241651",3,0,'%',6) );
//		System.out.println( ensitiveStr("532424198107241651",0,4,'^',6) );
//		System.out.println( ensitiveStr("532424198107241651",0,4,'c',0) );
//		System.out.println( ensitiveStr("5324",4,4,'^',6) );
//		System.out.println( ensitiveStr("",4,4,'^',6) );
		
//		System.out.println( toPercentNice(new BigDecimal("12.345678")));
//		System.out.println( toPercentNice(new BigDecimal("0.12345678")));
//		System.out.println( toPercentNice(new BigDecimal("0.11112")));
//		System.out.println( toPercentNice(new BigDecimal("0.567345678")));
//		System.out.println( toPercentNice(new BigDecimal("0.000123")));
//		System.out.println( toPercentNice(new BigDecimal("0.2000003")));
//		System.out.println( toPercentNice(new BigDecimal("0.0850123")));
//System.out.println("------------------------------");
//		System.out.println( toPercentOral(new BigDecimal("12.345678"),2,RoundingMode.HALF_DOWN));
//		System.out.println( toPercentOral(new BigDecimal("0.12345678"),2,RoundingMode.HALF_DOWN));
//		System.out.println( toPercentOral(new BigDecimal("0.11112"),2,RoundingMode.HALF_DOWN));
//		System.out.println( toPercentOral(new BigDecimal("0.567345678"),2,RoundingMode.HALF_DOWN));
//		System.out.println( toPercentOral(new BigDecimal("0.000123"),2,RoundingMode.HALF_DOWN));
		
		
		Map maps = new HashMap<String,String>() ;
		maps.put("123", "123") ;
		maps.put("1231", "123sd") ;
		maps.put("123d", "123rt") ;
		System.out.println(showMaps(maps)) ;
	}

}
